package com.cnzhy;


import java.util.concurrent.*;

/**
 * @Author: zhaoyan5
 * 虚拟线程是轻量级的线程，特别适合于I/O密集型任务。
 * 它们由JVM管理，可以在单个操作系统线程上创建成百上千个虚拟线程，而不会导致过多的线程创建和上下文切换。
 * 虚拟线程可以简化异步编程，使代码更易于理解和维护，并且能够更高效地利用底层资源，如CPU和内存。
 * 然而，虚拟线程不适用于计算密集型任务，因为它们需要CPU资源的支持‌。
 *
 * 虚拟线程毕竟是虚拟的，就像虚拟机也是虚拟的，是需要真实操作系统来支撑运行的。而虚拟线程仍然是基于线程来进行调度执行的。
 *
 * 1.使用 Thread.startVirtualThread() 创建
 * 2.使用 Thread.ofVirtual() 创建
 * 3.使用 ThreadFactory 创建
 * 4.使用 Executors.newVirtualThreadPerTaskExecutor()创建
 */
//@Slf4j
public class Main {

    public static void main(String[] args) {
        /**
         * 这种方法允许你创建一个未启动的虚拟线程，并通过调用start()方法来启动它。这种方式提供了更多的灵活性，允许你在需要时手动启动线程。
         */
        Thread.ofVirtual().name("虚拟线程名称", 123).start(() -> {
            System.out.println("虚拟线程1");
            System.out.println("虚拟线程1");
            System.out.println(Thread.currentThread().isVirtual() + " = " + Thread.currentThread().getName());
        });
        /**
         * 这种方法直接创建一个并立即启动虚拟线程，不需要手动调用start()方法。它适用于那些需要立即执行的场景
         */
        Thread.startVirtualThread(() -> {
            System.out.println("虚拟线程2");
            System.out.println("虚拟线程2");
        });
        /**
         * 平台线程
         */
        Thread.ofPlatform().start(() -> {
            System.out.println("虚拟线程3");
            System.out.println("虚拟线程3");
            System.out.println(Thread.currentThread().getName());
        });
        /**
         *
         */
        Executor executor = Executors.newVirtualThreadPerTaskExecutor(); // 使用虚拟线程执行器
        executor.execute(() -> {
            System.out.println("虚拟线程4");
            System.out.println("虚拟线程4");
            System.out.println(Thread.currentThread().getName());
        });
        SubmissionPublisher<String> publisher = new SubmissionPublisher<>(executor, 10); // 创建发布者，使用虚拟线程执行器
//        publisher.<String>submit(() -> { // 提交任务到发布者，这将在一个虚拟线程中执行
//            Context context = Context.of("threadName", "MyVirtualThread"); // 创建包含自定义上下文的上下文对象
//            context.<String>run(() -> { // 在此上下文中运行代码块，可以使用上下文中的数据（如自定义名称）
//                System.out.println("Virtual Thread Name: " + Context.get("threadName")); // 输出自定义名称
//            });
//        });
        /**
         *
         */
        ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
        executorService.submit(new MyTask());
        executorService.submit(new MyTask());
        executorService.submit(new MyTask());
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);
        fixedThreadPool.submit(new MyTask());

        /**
         * 使用工厂类创建任务
         */
        MyTask task = new MyTask();
        ThreadFactory factory = Thread.ofVirtual().factory();
        Thread thread = factory.newThread(task);
        thread.start();

    }

    static class MyTask implements Runnable {
        @Override
        public void run() {
            try {
                System.out.println(Thread.currentThread());
            } catch (Exception e) {

            }
        }

    }

}